RedLock
可讀性低,需要整理
Brief
Lock
SET lockname my_random_number NX PX 30000
- NX: create if not exist, 避免重複。
- PX: TTL, 避免 Lock 持有者意外消失但沒有解鎖。
Unlock
if GET(lockname) == my_random_number then
# ok, I still have lock.
DEL lockname
else
# lock may be expired before I try to unlock it.
end
這操作乍看之下可能需要 atomic ,因為 GET(lockname) == my_random_number
保證了只有持有者可以滿足這個條件,但考慮以下情境:
- Process1 going to unlock: 通過
GET(lockname) == my_random_number
- Lock expired!!
- Process2 lock
- Process1:
DEL lockname
⚠️: unlock Process2's Lock!
這段確實是需要 atomic 。
Cluster
在 Redis Cluster 的情況下, RedLock 使用情況會變得更為嚴峻:由於 Lock 本身有 TTL,再加上存取 Cluster 的共識值(例如超過半數都是某個數值)會需要更多時間,所以實際上有效持有 Lock 的時間是 TTL - 取得共識值消耗的時間
。
🤔 疑問
很好奇在那些情況下會選用這個方案。